import axios, { type AxiosResponse, type AxiosResponseHeaders } from 'axios';
import { ElMessage, ElMessageBox } from 'element-plus';
import pinia from '@/stores/index';
import { useUserInfoStore } from '../stores/userInfo';

/* 定义response对象的data接口 */
interface ResponseData<T> {
  code: number;
  data: T;
  message: string;
}

// 配置新建一个 axios 实例
const service = axios.create({
	baseURL: import.meta.env.VITE_API_URL,
	timeout: 50000,
});

// 添加请求拦截器
//保证拥有获取数据的权限
//token是从用户信息存储中获取的。然后，将这个token添加到请求的headers中，以便在发送请求时携带这个token。 
// 最后，将修改后的config对象返回，以确保请求继续进行。 这段代码的作用是在每个请求中自动添加一个token，以便进行身份验证或其他需要使用token的操作。
service.interceptors.request.use(
	(config) => {
    let token=useUserInfoStore().token
    if(token){
      (config.headers as AxiosResponseHeaders).token=token;
    }  
		return config;
	}
);

// 添加响应拦截器
service.interceptors.response.use(
  /* 约束一下response */
	async (response: AxiosResponse<ResponseData<any>>) => {
		// 对响应数据做点什么
		const res = response.data;
    if (res.code !== 20000 && res.code !== 200) { /* 成功数据的code值为20000/200 */
      // 统一的错误提示
      ElMessage({
        message: (typeof res.data=='string' && res.data) || res.message || 'Error',
        type: 'error',
        duration: 5 * 1000
      })
      return Promise.reject(service.interceptors.response)
    } else {
      return res.data /* 返回成功响应数据中的data属性数据 */
    }
  },
	(error) => {
		// 对响应错误做点什么
		ElMessage.error(error.message);
		return Promise.reject(error);
	}
);

export default service;
